## Krawtchouk's polynomials

from PyM import *


def newton(j):
    [_,x] = polynomial_ring(Q_,'x', name = 'Q[x]')
    N = 1
    for i in range(1,j+1):
        N *= x-i+1
    return N/factorial(j)
    
def krawtchouk(k,n,q=2):
    if k==0: return 1
    [_,x] = polynomial_ring(Q_,'x')
    def n_(j):
        N = 1
        for i in range(1,j+1):
            N *= (x-i+1)
        return N/factorial(j) 
    def m_(j):
        M = 1
        for i in range(1,j+1):
            M *= n-x-i+1
        return M/factorial(j)
    S = 0
    for j in range(k+1):
        sj = (-1)**j * n_(j)*m_(k-j)*(q-1)**(k-j)
        S += sj
    return S

##Examples

show(krawtchouk(0,17))

show([krawtchouk(1,n) for n in range(5)])

show([krawtchouk(2,n) for n in range(4)])



